Day 27 的數字已經說服筆者:在 Go 的世界,跨界成本是壓倒性的常數項。這篇把「為什麼要 native 重寫」講清楚,回到編譯器與執行模型的基礎,並提出實際的重寫路線與風險控管
結論:若目標是「最短路徑」,就應讓熱路徑留在 Go 世界裡
$eq/$gt/$in/$and/$or/$elemMatch/...
遷移策略:先實作最常用的 primitive 與邏輯運算子,確保 80% 場景可用,再逐步補齊長尾
$eq/$gt/$gte/$lt/$lte/$in/$nin/$and/$or
native 化,保留 explain/trace$elemMatch/$every
與 regex/native custom 完成當 Go 編譯器與 runtime 已足夠強大時,最佳解法往往是「讓熱路徑留在 Go」。Mongory-core
但做完了初步橋接後,進行 benchmark 測試
跟 ruby 一樣進行十萬筆資料比對
純 ruby code 速度是 20ms
ruby C mongory 也是 20ms
純 go 來到令人髮指的 2ms
但 go C mongory 卻是 90ms
令人意外的慢,失望
究其根本原因還是 go <-> C 的 cgo 呼叫邊緣成本解決不了
golang 雖然也是從 C lang 起家
但現在已經是用 golang 寫的編譯器來編譯 golang
發展史是
Clang -> bin 編譯器 -> 編譯 golang 寫的編譯器 code -> bin 編譯器
現在跟 Clang 其實幾乎是同一個 level
所以現在要解決,就只能用純 golang 來寫 mongory go
不靠 C core 在 Mongory 的 Ruby 版是英雄,但在 Go 版,最終答案會是 native。保留既有 DSL 與 AST,替換執行核心,才能真正兌現「輕鬆用、跑得快」